<?php
/**
 * 框架 - 控制器类
 * 
 * @version $Id: Controller.php 187 2011-05-23 07:57:55Z linsir123 $
 */
class Controller
{
	/**
	 * @var 控制器类名称
	 */
	public $controllerName;
	
	/**
	 * @var 控制器方法名称
	 */
	public $actionName;
	
	/**
	 * @var 控制器方法
	 */
	public $actionMethod;
	
	/**
	 * 构造函数
	 */
	public function __construct($controllerName = '')
	{
		$this->controllerName = $controllerName;
	}
	
	/**
	 * 返回访问控制列表
	 */
	public function accessRules()
	{
		/**
		 return array(
			'deny'=>array(
				'users'=>array('*')
			),
			'allow'=>array(
				'actions'=>array('index','client','server'),
				'users'=>array('*')
			)
		);
		 */
		return array();
	}
	
	/**
	 * 返回需要执行过滤的方法列表
	 */
	public function filterActions()
	{
		/**
		 return array('index','client','clent2');
		 */
		return array();
	}
	
	/**
	 * 返回由指定动作执行方法列表
	 */
	public function actions()
	{
		/*
		return array('server'=>array('action'=>'soapService'));
		*/
		return array();
	}
	
	/**
	 * 返回默认控制器方法
	 */
	public function defaultAction()
	{
		return 'index';
	}
	
	/**
	 * 前置过滤
	 */
	public function beforeAction() {}
	
	/**
	 * 后置过滤
	 */
	public function afterAction() {}
	
	
	/// 以上方法均提供为子类覆盖的  ///
	
	
	/**
	 * 动作 - Soap
	 */
	public function soapService()
	{
		$className = App::getDispatcher()->controllerClass;
		$wsdlUrl = lpUrl::__($this->controllerName.'/'.$this->actionName, null, true);
		$soap = new Soap($wsdlUrl, $className, $className);
		$soap->handle();
	}
	
	/**
	 * 由Dispatcher调用执行控制器方法
	 */
	public function runAction($actionName = null)
	{
		$this->actionName = $actionName;
		
		///
		$this->_checkAction();
		$this->_checkAccessControll();
		
		///
		$methods = $this->_getMethods();
		foreach ($methods as $method) 
			call_user_func_array(array($this, $method), array());
	}
	
	/**
	 * 检测控制器是否绑定系统提供的动作处理
	 */
	private function _checkAction()
	{
		if (empty($this->actionName)) 
			$this->actionName = $this->defaultAction();
			
		///
		$actions = $this->actions();
		if (is_array($actions) && array_key_exists($this->actionName, $actions)) 
			$this->actionMethod = $actions[$this->actionName]['action'];
		else 
			$this->actionMethod = 'action'.ucfirst($this->actionName);
			
		///
		method_exists($this, $this->actionMethod) or 
			App::getDispatcher()->goto404("控制器方法({$this->actionMethod})不存在。");
	}
	
	/**
	 * 验证访问控制
	 */
	private function _checkAccessControll()
	{
		if ($accessRules = $this->accessRules()) 
			App::getAccessControll()->check($accessRules, $this->actionName) or 
				App::getDispatcher()->goto404("拒绝访问。");
	}
	
	/**
	 * 验证方法过虑列表
	 */
	private function _getMethods()
	{
		$actions = $this->filterActions();
		if (in_array($this->actionName, $actions)) 
			$methods = array('beforeAction', $this->actionMethod, 'afterAction');
		else 
			$methods = array($this->actionMethod);
			
		return $methods;
	}
	
	/**
	 * 在一个控制器类中定义一个SOAP方法
	 * 
	 * @param string $username
	 * @return string
	 * @soap
	 */
	/*
	function hello($username)
	{
		return "我也不知道！你好，" . $username;
	}
	*/
}
